/**
 * 排班表核心类型定义
 * 所有插件和组件共享的类型接口
 */

// ==================== 基础数据类型 ====================

/** 员工信息 */
export interface Employee {
  id: string | number
  name: string
  avatar?: string
  department?: string
  departmentColor?: string
  position?: string
  [key: string]: any // 允许扩展字段
}

/** 班次类型 */
export type ShiftType = 'morning' | 'afternoon' | 'night' | 'custom'

/** 班次信息 */
export interface Shift {
  id: string | number
  employeeId: string | number
  employeeName?: string
  date: string // YYYY-MM-DD
  type: ShiftType
  startTime?: string // HH:mm
  endTime?: string // HH:mm
  color?: string
  note?: string
  [key: string]: any // 允许扩展字段
}

/** 视图模式 */
export type ViewMode = 'day' | 'week' | 'month' | 'custom'

/** 日期范围 */
export interface DateRange {
  start: string // YYYY-MM-DD
  end: string // YYYY-MM-DD
}

// ==================== 插件系统类型 ====================

/** 插件配置 */
export interface PluginConfig {
  /** 插件唯一标识 */
  id: string
  /** 插件名称 */
  name: string
  /** 插件版本 */
  version?: string
  /** 插件描述 */
  description?: string
  /** 插件作者 */
  author?: string
  /** 插件依赖 */
  dependencies?: string[]
  /** 插件配置 */
  options?: Record<string, any>
}

/** 插件生命周期钩子 */
export interface PluginLifecycle {
  /** 插件安装时调用 */
  onInstall?: (context: ScheduleContext) => void | Promise<void>
  /** 插件卸载时调用 */
  onUninstall?: (context: ScheduleContext) => void | Promise<void>
  /** 插件启用时调用 */
  onEnable?: (context: ScheduleContext) => void | Promise<void>
  /** 插件禁用时调用 */
  onDisable?: (context: ScheduleContext) => void | Promise<void>
  /** 数据更新时调用 */
  onDataChange?: (context: ScheduleContext, data: unknown) => void
}

/** 插件接口 */
export interface Plugin extends PluginConfig, PluginLifecycle {
  /** 插件是否已启用 */
  enabled?: boolean
  /** 插件渲染组件（可选） */
  component?: React.ComponentType<PluginComponentProps>
  /** 插件提供的方法 */
  methods?: Record<string, (...args: unknown[]) => unknown>
  /** 插件提供的状态 */
  state?: Record<string, any>
}

/** 插件组件属性 */
export interface PluginComponentProps {
  context: ScheduleContext
  [key: string]: any
}

// ==================== 上下文类型 ====================

/** 调度上下文 - 提供给插件的核心API */
export interface ScheduleContext {
  /** 获取所有员工 */
  getEmployees: () => Employee[]
  /** 添加员工 */
  addEmployee: (employee: Employee) => void
  /** 更新员工 */
  updateEmployee: (id: string | number, employee: Partial<Employee>) => void
  /** 删除员工 */
  removeEmployee: (id: string | number) => void

  /** 获取所有班次 */
  getShifts: () => Shift[]
  /** 获取指定日期范围的班次 */
  getShiftsByDateRange: (start: string, end: string) => Shift[]
  /** 获取指定员工的班次 */
  getShiftsByEmployee: (employeeId: string | number) => Shift[]
  /** 添加班次 */
  addShift: (shift: Shift) => void
  /** 更新班次 */
  updateShift: (id: string | number, shift: Partial<Shift>) => void
  /** 删除班次 */
  removeShift: (id: string | number) => void

  /** 获取当前视图模式 */
  getViewMode: () => ViewMode
  /** 设置视图模式 */
  setViewMode: (mode: ViewMode) => void

  /** 获取当前日期范围 */
  getDateRange: () => DateRange
  /** 设置日期范围 */
  setDateRange: (range: DateRange) => void

  /** 事件总线 - 发布事件 */
  emit: (event: string, data?: any) => void
  /** 事件总线 - 订阅事件 */
  on: (event: string, handler: (data?: any) => void) => () => void
  /** 事件总线 - 取消订阅 */
  off: (event: string, handler: (data?: any) => void) => void

  /** 获取插件实例 */
  getPlugin: (id: string) => Plugin | undefined
  /** 获取所有插件 */
  getPlugins: () => Plugin[]
  /** 调用插件方法 */
  callPluginMethod: (pluginId: string, method: string, ...args: any[]) => any

  /** 获取配置 */
  getConfig: () => ScheduleConfig
  /** 更新配置 */
  updateConfig: (config: Partial<ScheduleConfig>) => void
}

// ==================== 配置类型 ====================

/** 排班表配置 */
export interface ScheduleConfig {
  /** 默认视图模式 */
  defaultView?: ViewMode
  /** 是否显示周末 */
  showWeekend?: boolean
  /** 一周开始日 0=周日 1=周一 */
  weekStartsOn?: 0 | 1
  /** 工作时间配置 */
  workingHours?: {
    start: string // HH:mm
    end: string // HH:mm
  }
  /** 班次类型配置 */
  shiftTypes?: {
    [key in ShiftType]?: {
      label: string
      color: string
      startTime: string
      endTime: string
    }
  }
  /** 是否启用拖拽 */
  draggable?: boolean
  /** 是否启用右键菜单 */
  contextMenu?: boolean
  /** 语言 */
  locale?: string
  /** 自定义样式 */
  theme?: {
    primaryColor?: string
    secondaryColor?: string
    dangerColor?: string
    warningColor?: string
  }
  /** 其他配置 */
  [key: string]: any
}

// ==================== 事件类型 ====================

/** 事件类型定义 */
export enum ScheduleEvents {
  // 数据事件
  EMPLOYEE_ADDED = 'employee:added',
  EMPLOYEE_UPDATED = 'employee:updated',
  EMPLOYEE_REMOVED = 'employee:removed',
  SHIFT_ADDED = 'shift:added',
  SHIFT_UPDATED = 'shift:updated',
  SHIFT_REMOVED = 'shift:removed',

  // 视图事件
  VIEW_CHANGED = 'view:changed',
  DATE_RANGE_CHANGED = 'dateRange:changed',

  // 交互事件
  SHIFT_CLICK = 'shift:click',
  SHIFT_DRAG_START = 'shift:dragStart',
  SHIFT_DRAG_END = 'shift:dragEnd',
  CELL_CLICK = 'cell:click',
  CELL_CONTEXT_MENU = 'cell:contextMenu',

  // 插件事件
  PLUGIN_INSTALLED = 'plugin:installed',
  PLUGIN_UNINSTALLED = 'plugin:uninstalled',
  PLUGIN_ENABLED = 'plugin:enabled',
  PLUGIN_DISABLED = 'plugin:disabled',

  // 配置事件
  CONFIG_UPDATED = 'config:updated',
}

// ==================== UI组件类型 ====================

/** 模态框配置 */
export interface ModalConfig {
  title: string
  content: React.ReactNode
  onConfirm?: () => void | Promise<void>
  onCancel?: () => void
  confirmText?: string
  cancelText?: string
}

/** 上下文菜单项 */
export interface ContextMenuItem {
  key: string
  label: string
  icon?: React.ReactNode
  disabled?: boolean
  onClick: () => void
}

/** 工具栏按钮 */
export interface ToolbarButton {
  key: string
  label: string
  icon?: React.ReactNode
  onClick: () => void
  disabled?: boolean
}

// ==================== 工具类型 ====================

/** 拖拽数据 */
export interface DragData {
  shiftId: string | number
  sourceDate: string
  sourceEmployeeId: string | number
}

/** 过滤器 */
export type FilterFunction<T> = (item: T) => boolean

/** 排序器 */
export type SortFunction<T> = (a: T, b: T) => number
